<?php
/**
 * Session
 *
 *
 * @package boot
 * @author  Platform Team
 */

class Session
{
    /**
     * 세션 아이피 검증 실패 코드
     */
    const ERROR_IP_VALID = 1;

    /**
     * 인스턴스
     * @var Session
     */
    private static $instance;

    /**
     * 핸들러 객체
     */
    private static $handler = false;

    /**
     * 생성자
     */
    private function __construct() {}

    /**
     * singleton
     *
     * @return Session
     */
    public static function getInstance()
    {
        if (!self::$instance) self::$instance = new self;

        return self::$instance;
    }

    /**
     * s alias 함수에서 사용하기 위해 만든 메소드
     *
     * @return Session
     */
    public static function instance()
    {
        return self::$instance;
    }

    /**
     * 인스턴스 파괴
     */
    public static function instancedel()
    {
        self::$instance = null;
    }

    /**
     * 세션 초기화
     *
     * @param array $aConfig
     */
    public function initialize($aConfig)
    {
        self::$handler = self::_loadHandler($aConfig);

        if (self::$handler === false) {
            return false;
        }

        return true;
    }

    /**
     * 쓰기
     * (두번째 인자를 주지 않으면 unset 으로 동작)
     *
     * @param string $sId
     * @param mixed $mData
     */
    public function set($sId, $mData=null)
    {
        return self::$handler->set($sId, $mData);
    }

    /**
     * 읽기
     * (인자가 없을 시 전체 데이터를 반환)
     * (데이터가 없는 경우는 false 반환)
     *
     * @param string $sId
     * @return mixed
     */
    public function get($sId=null)
    {
        return self::$handler->get($sId);
    }

    /**
     * 세션 핸들러에 등록된 close 함수와 개별적으로 동작하는 메소드 호출
     * 코어단에서 내부적으로 자동 호출되는 메소드이므로 특수한 상황을 제외하고는 직접 호출하지 않도록 함
     */
    public function close()
    {
        return self::$handler->individualClose();
    }

    /**
     * 파괴
     *
     * @return boolean
     */
    public function destruct()
    {
        return self::$handler->destruct();
    }

    /**
     * 세션아이디 반환
     *
     * @return string
     */
    public function sessionId()
    {
        return self::$handler->sessionId();
    }

    /**
     * 세션 아이디 재발급
     *
     * @return boolean
     */
    public function sessionIdRegenerate()
    {
        return self::$handler->sessionIdRegenerate();
    }

    /**
     * 세션 데이터의 저장 억제
     *
     * @param boolean $isEnable 활성화 여부(기본값 true)
     *
     * !!WARNING!!
     * AJAX 등의 비동기 요청을 통해 세션데이터를 쓰는 동시다발적 프로세스가 생성되는 경우
     * 세션데이터를 최종적으로 저장할 때, 프로세스의 완료시점에 따라 데이터가 정상적으로 저장되지 않는 현상을
     * 방지하기 위해 마련된 메소드입니다.
     *
     * 해당 메소드의 역할은 PHP 프로세스가 종료될 때, 발생하는 세션 write 핸들러의 동작을 억제합니다.
     * 즉, 읽기만 하는 비동기 요청 페이지에서 해당 메소드를 실행시켜놓으면 위와 같은 현상을 막을 수 있습니다.
     * @return boolean
     */
    public function preventSave($isEnable=true)
    {
        return self::$handler->preventSave($isEnable);
    }

    /**
     * 핸들러 객체 로드
     *
     * @param array $aConfig
     * @return object | false
     */
    private static function _loadHandler($aConfig)
    {
        $sDefaultPrefix = FW_CLASS_PREFIX_FRAMEWORK_CORE . 'Session';

        $sClass= _getTypedefDriverName($aConfig['sess_type'], $sDefaultPrefix);


        if (!class_exists($sClass)) {

            return false;

        }

        self::$handler = new $sClass($aConfig);

        return self::$handler;
    }
}
